package com.online.controller;

import com.faneui.common.bean.BaseResp;
import com.faneui.common.exception.BusinessException;
import com.faneui.common.utils.ListUtils;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.online.dal.dao.ProductDAO;
import com.online.dal.dao.UserDAO;
import com.online.dal.model.Product;
import com.online.dal.model.User;
import org.apache.commons.lang3.StringUtils;
import org.apache.ibatis.javassist.expr.NewArray;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpSession;
import java.util.List;
import java.util.Map;
//使用@Controller时需要用@ResponseBody注释
@RestController//代表该类是充当Controller的作用，自动添加@Controller和@ResponseBody注释
@RequestMapping("addProduct")//RequestMapping是用来处理请求地址映射的注解，可用于类或方法上
public class AddProductController {

    @Autowired //注解，它对类成员变量 方法及构造函数进行标注，完成自动装配的工作，通过使用来消除 set ，get方法
    private ProductDAO productDAO;

    @Autowired
    private HttpSession httpSession;

    @RequestMapping(value = "", method = RequestMethod.GET)
    public ModelAndView indexOfAll() throws Exception {
        //使用ModelAndView类用来存储处理完后的结果数据，以及显示该数据的视图
        ModelAndView mv = new ModelAndView("product");
        return mv;
    }


    @RequestMapping(value = "/doaddProduct", method = RequestMethod.POST)
    @ResponseBody
    public BaseResp doAddProduct(@RequestBody Product product) throws BusinessException {
        BaseResp resp = new BaseResp();//使用ModelAndView类用来存储处理完后的结果数据，以及显示该数据的视图
        try {
            // 校验 product 参数是否为空
            if (product.getId() == null) {
                throw new BusinessException("加入购物车失败");
            }
            Product pro = productDAO.queryById(product.getId());
            if (pro == null) {
                throw new BusinessException("产品不存在");
            }
            String key = "productList";
            //声明productList队列空间，获取存在会话中的productList空间对象并赋值
            List<Map<String, Object>> productList = (List<Map<String, Object>>) httpSession.getAttribute(key);
            //如果会话中productList对象空间为空，新建一个空的productList队列空间
            if (productList == null) {
                productList = Lists.newArrayList();
            }
            //创建一个Map对象，赋值为空
            Map<String, Object> resvMap = null;
            for (Map<String, Object> map : productList) {//循环productList空间对象，并赋值给Map对象resvMap
                if (product.getId().equals(map.get("product_id"))) {//将前台传入参数与赋值给map的值进行匹配
                    resvMap = map;//将匹配成功的map赋值给resvMap
                    break;
                }
            }
            if (resvMap == null) {
                resvMap = Maps.newHashMap();
                resvMap.put("product_id", pro.getId());//put()方法对集合框架，添加（键-值）对，并覆盖原来的值
                resvMap.put("name", pro.getName());
                resvMap.put("price", pro.getPrice());
                resvMap.put("num", 1);
                productList.add(resvMap);//add()方法对集合框架添加resvMap集合，与put()方法返回值不同
            } else {
                resvMap.put("num", (Integer) resvMap.get("num") + 1);
            }
            resvMap.put("totalPrice", pro.getPrice() * (Integer) resvMap.get("num"));


            httpSession.setAttribute(key, productList);//给回话放入一个键（productList)-值(productList对象）对

        } catch (Exception ex) {
            resp.setSuccess(false);
            resp.setMsg(ex.getMessage());
        }
        return resp;
    }


}
